package com.cyy.demo.utils;

import org.apache.commons.lang.StringUtils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;


public class ImageBase64 {
	
	/**
	 * data:image/jpeg;base64, base64图片开始固定的内容
	 * @param base64
	 * @return base64图片开始固定的内容
	 */
	public static String base64(String base64){
		if (base64.indexOf("base64,") > -1) {
			return StringUtils.substringAfterLast(base64,";base64,");
		}
		return base64;
	}

	/**
	 * @Descriptionmap 将图片文件转化为字节数组字符串，并对其进行Base64编码处理
	 * @param path 图片路径
	 * @return
	 */
	public static String imageToBase64ByImagePath(String path) {
		if(StringUtils.isBlank(path)){
			return null;
		}
		if(!new File(path).exists()){
			return null;
		}
		byte[] data = null;
		// 读取图片字节数组
		try {
			InputStream in = new FileInputStream(path);
			data = new byte[in.available()];
			in.read(data);
			in.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 对字节数组Base64编码
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);// 返回Base64编码过的字节数组字符串
	}

	/**
	 * @Descriptionmap 对字节数组字符串进行Base64解码并生成文件
	 * @param base64 文件Base64数据
	 * @param path 文件路径
	 * @return
	 */
	public static boolean base64ToFile(String base64, String path) {
		if (base64 == null){ // 图像数据为空
			return false;
		}
		File file=new File(path);
		if (!file.getParentFile().exists()){
			file.getParentFile().mkdirs();
		}
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			// Base64解码
			byte[] bytes = decoder.decodeBuffer(base64);
			for (int i = 0; i < bytes.length; ++i) {
				if (bytes[i] < 0) {// 调整异常数据
					bytes[i] += 256;
				}
			}
			// 生成jpeg图片
			OutputStream out = new FileOutputStream(path);
			out.write(bytes);
			out.flush();
			out.close();
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public static String imageToBase64ByImageUrl(String url) throws Exception {
		BASE64Encoder encoder = new BASE64Encoder();
		byte[] result = imageToBase64ByteByImageUrl(url);
		if(result==null) return null;
		return encoder.encode(result);// 返回Base64编码过的字节数组字符串
	}
	
	
	/** 
     * 获取网络图片并转为Base64编码 
     *  
     * @param url 
     *            网络图片路径 
     * @return base64编码 
     * @throws Exception
     */  
    public static byte[] imageToBase64ByteByImageUrl(String url) throws Exception {
        if (url == null || "".equals(url.trim()))  
            return null;
        
        byte[] data = null;
        URL u = new URL(url);
        // 打开图片路径  
        HttpURLConnection conn = (HttpURLConnection) u.openConnection();
        // 设置请求方式为GET  
        conn.setRequestMethod("GET");  
        // 设置超时响应时间为5秒  
        conn.setConnectTimeout(50000);  
        
        if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {
            // 通过输入流获取图片数据  
            InputStream inStream = conn.getInputStream();
            // 读取图片字节数组  
            data = readInputStream(inStream); 
            //inStream.read(data);  
            //inStream.close();
        }
  
        return data;
    }
    
	public static byte[] readInputStream(InputStream inStream) throws Exception {
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		//创建一个Buffer字符串
		byte[] buffer = new byte[1024];
		//每次读取的字符串长度，如果为-1，代表全部读取完毕
		int len = 0;
		//使用一个输入流从buffer里把数据读取出来
		while( (len=inStream.read(buffer)) != -1 ){
			//用输出流往buffer里写入数据，中间参数代表从哪个位置开始读，len代表读取的长度
			outStream.write(buffer, 0, len);
		}
		//关闭输入流
		inStream.close();
		//把outStream里的数据写入内存
		return outStream.toByteArray();
	}
	
	public static void main(String[] args){
//		String path="E:\\Works\\CTO\\NetPosa\\Product\\PBD\\pbd-zhsq\\docs\\06参考资料\\Data\\幸福里\\20180407\\WJ沪47444\\WJ沪47444_20180407125906159.jpg";
        String path="C:\\Users\\DELL\\Desktop\\1.jpg";

        System.out.println(11111111);


		String result = imageToBase64ByImagePath(path);
		System.out.println(result);
		
		base64ToFile(result,"D:/1.jpg");
	}
}